package com.hxs.hxsserver.utils;

import com.hxs.hxsserver.exception.ApiException;

/**
 * @author liuchuan
 * @create 2024/9/25
 */
public class ByteUtil {
    // 将字节数组转换为十六进制字符串
    public static String bytesToHex(byte[] bytes, int length) {
        StringBuilder hexString = new StringBuilder();
        for (int i = 0; i < length; i++) {
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                hexString.append('0'); // 在单个字符前加零
            }
            hexString.append(hex);
        }
        return hexString.toString().toUpperCase(); // 转换为大写
    }

    public static byte[] hexStringToByteArray(String hexMessage) {
        if (hexMessage.length() % 2 != 0) {
            throw new ApiException(900015,"十六进制字符串长度必须是偶数");
        }

        byte[] hexBytes = new byte[hexMessage.length() / 2];
        for (int i = 0; i < hexMessage.length(); i += 2) {
            hexBytes[i / 2] = (byte) ((Character.digit(hexMessage.charAt(i), 16) << 4)
                    + Character.digit(hexMessage.charAt(i + 1), 16));
        }
        return hexBytes;
    }


    // 将十六进制字符串转换为十进制整数
    public static int hexToDecimal(String hex) {
        // 去除可能的前缀
        if (hex.startsWith("0x") || hex.startsWith("0X")) {
            hex = hex.substring(2);
        }

        // 使用Integer.parseInt来解析十六进制字符串为十进制整数
        int decimal = Integer.parseInt(hex, 16);

        // 如果十六进制数大于 0x7FFF，表示它是负数，计算补码
        if (decimal > 0x7FFF) {
            decimal -= 0x10000;  // 如果是负数，转换为负数的十进制
        }
        return decimal;
    }
    // 将十六进制字符串转换为十进制整数
    public static long hexToDecimal32(String hex) {
        // 去除可能的前缀
        if (hex.startsWith("0x") || hex.startsWith("0X")) {
            hex = hex.substring(2);
        }

        // 使用 Long.parseLong 来解析十六进制字符串为长整型 long
        long decimal = Long.parseLong(hex, 16);

        // 如果十六进制数大于 0x7FFFFFFF，表示它是负数，计算补码
        if (decimal > 0x7FFFFFFF) {
            decimal -= 0x100000000L;  // 如果是负数，转换为负数的十进制
        }

        // 返回 32 位整数
        return  decimal;
    }

    public static void main(String[] args) {
        System.out.println(ByteUtil.hexToDecimal32("80000000"));
    }
    // 将十进制整数转换为两位十六进制字符串
    public static String decimalToHex(int decimal) {
        // 将十进制转换为十六进制，并确保结果是两位
        return String.format("%02X", decimal);
    }
}
